旧:RustのHyperでBodyの終わりを検出して好きな処理をする(Piping Server (Hyper) v0.2.1)
hr.icon
やりたいこと
コード例
code:rs
struct ReceiverResBody {
sender_req_body: Body,
sender_res_body_sender: hyper::body::Sender,
}
impl futures::stream::Stream for ReceiverResBody {
type Item = Chunk;
type Error = hyper::Error;
fn poll(&mut self) -> Result<Async<Option<Self::Item>>, Self::Error> {
match self.sender_req_body.poll() {
// If sender's response body is finished
Ok(Async::Ready(None)) => {
// Notify sender when sending finished
self.sender_res_body_sender.send_data(Chunk::from("INFO Sent successfully!\n")).unwrap(); // Close sender's response body
self.sender_res_body_sender.close().unwrap();
Ok(Async::Ready(None))
},
r@ _ => r
}
}
}
注目点
structのReceiverResBodyではBodyを保持している。
sender_res_body_senderはBodyの終了がわかったときに伝えるチャンネルとかにすれば良いと思う。
自作のstructReceiverResBodyがfutures::stream::Streamを実装している。
Streamを実装しているので、Body::wrap_stream(ReceiverResBody{...})のようにすることでBodyに変形できる。
そして、Ok(Async::Ready(None))のとき、つまりNoneのときストリームの終了に相当するので、このときにストリーム終了時にしたい処理をすれば良い
上記の例だと、Body終了時に[INFO] Sent successfully!\nというメッセージを送ることをしている。
r@ _ => rはNoneじゃないときにを全部そのままにしている